//给定一个 n × n 的二维矩阵表示一个图像。 
//
// 将图像顺时针旋转 90 度。 
//
// 说明： 
//
// 你必须在原地旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 
//
// 示例 1: 
//
// 给定 matrix = 
//[
//  [1,2,3],
//  [4,5,6],
//  [7,8,9]
//],
//
//原地旋转输入矩阵，使其变为:
//[
//  [7,4,1],
//  [8,5,2],
//  [9,6,3]
//]
// 
//
// 示例 2: 
//
// 给定 matrix =
//[
//  [ 5, 1, 9,11],
//  [ 2, 4, 8,10],
//  [13, 3, 6, 7],
//  [15,14,12,16]
//], 
//
//原地旋转输入矩阵，使其变为:
//[
//  [15,13, 2, 5],
//  [14, 3, 4, 1],
//  [12, 6, 8, 9],
//  [16, 7,10,11]
//]
// 
// Related Topics 数组 
// 👍 541 👎 0

package leetcode.editor.cn;

//Java：旋转图像
public class P48RotateImage {

    /**
     * 思路： 旋转后 的 纵坐标是原本的横坐标，横坐标是n-纵坐标-1,
     * 但是不能建一个二维数组直接填新的数据，那就得认真考虑怎么做交换才能不影响到原先的顺序
     * 循环结束的条件比较绕
     *
     * 执行用时： 16 ms , 在所有 Java 提交中击败了 100.00% 的用户 内存消耗： 40 MB , 在所有 Java 提交中击败了 22.21% 的用户
     */
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public void rotate(int[][] matrix) {
            int len = matrix.length;
            int mid = len / 2 + len % 2;
            int tempX = 0;
            int tempY = 0;

            // 先排最外层的点，然后排里面的点
            for (int x = 0; x < mid; x++) {
                for (int y = x; y < len - 1 - x; y++) {
                    System.out.println(x + "," + y);
                    for (int k = 0; k < 3; k++) {
                        if (k == 0) {
                            tempX = x;
                            tempY = y;
                        }
                        //  x,y -> y,len-x 交换三次
                        int rotateX = tempY;
                        int rotateY = len - tempX - 1;
                        swap(matrix, tempX, tempY, rotateX, rotateY);
                        tempX = rotateX;
                        tempY = rotateY;
                    }
                }
            }
        }

        // 交换   x,y 对应的 是 [y][x]，...
        private void swap(int[][] matrix, int i, int j, int m, int n) {
            int temp = matrix[j][i];
            matrix[j][i] = matrix[n][m];
            matrix[n][m] = temp;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

    public static void main(String[] args) {
        Solution solution = new P48RotateImage().new Solution();
        int[][] matrix = new int[][]{{1,2,3}, {4,5,6}, {7,8,9}};
        solution.rotate(matrix);
        System.out.println(matrix.toString());
        // TO TEST
    }

}